package com.sdry.untils;

import com.sdry.reportforms.entity.ZJPoint;

/**
 * @ClassName CoordinatesUtil
 * @Descreption 根据打卡坐标计算是否在考勤范围之内
 * @Author lianleiming
 * @Date 2020-04-0310:47
 * @Version 1.0
 **/
public class CoordinatesUtil {

    /**
     * 将角度换算为弧度
     * @param d 角度
     * @return 弧度
     */
    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 陕西华强涂装技术有限公司
     * 陕西省西安市高陵区崇皇街道军庄村西南方向
     * 谷歌地图：34.4842802800,109.0287721300
     * 百度地图：34.4900658900,109.0353854200
     * 腾讯高德：34.4842930000,109.0288000000
     * 谷歌地球：34.4855184500,109.0237724900
     */

    /**
     * 先通过经纬度获取距离(单位：米)，再判断一个点是否在圆形区域内（根据所给的半径坐比较）
     * @param n1=>app
     * @param n2=>仓库
     * @param radius 考勤范围半径，单位km
     * @return 返回true/false
     */
    public static boolean isInCircle(ZJPoint n1 , ZJPoint n2, String radius){
        //地球半径 （千米）
        final double EARTH_RADIUS = 6378.137;
        double radLat1 = rad(n1.getX()!=null ? Double.parseDouble(n1.getX()):0);
        double radLat2 = rad(n2.getX()!=null ? Double.parseDouble(n2.getX()):0);
        double radLon1 = rad(n1.getY()!=null ? Double.parseDouble(n1.getY()):0);
        double radLon2 = rad(n2.getY()!=null ? Double.parseDouble(n2.getX()):0);
        //两点之间的差值
        double jdDistance = radLat1 - radLat2;
        double wdDistance = radLon1 - radLon2;
        double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(jdDistance / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(wdDistance / 2), 2)));
        distance = distance * EARTH_RADIUS;
        distance = Math.round(distance * 10000d) / 10000d;
        //将计算出来的距离千米转为米
        distance = distance*1000;
        double r = Double.parseDouble(radius);
        //判断一个点是否在圆形区域内
        if (distance >= r) {
            return true;
        }
        return false;
    }
}
